import java.io.File;
import java.net.URL;

/**
 * 该类中的实列给出了  如何各种获取资源文件的路径
 * <p>
 * !!!
 * IntelliJ 默认将编译后的 .class 文件拷贝至编译后的目录(target/classes)，不包括其他文件，例如 .txt 文件。
 * （即使 a.txt 文件和类文件在项目中是同一个目录下,也会抛出异常, 因为它并没有拷贝到classes中的相应目录中去）
 * <p>
 * 解决IDEA的这个问题有两种方式。
 * <p>
 * 第一种是建立src/main/resources文件夹，将xml等资源文件放置到这个目录中。
 * maven工具默认在编译的时候，会将resources文件夹中的资源文件一块打包进classes目录中。
 * <p>
 * 第二种解决方式是配置maven的pom文件配置，在pom文件中找到<build>节点
 * <build>
 * <resources>
 * <resource>
 * <directory>src/main/java</directory>
 * <includes>
 * <include>** /*.xml</include>
 * </includes>
 * </resource>
 * </resources>
 * </build>
 * <p>
 * 其中<directory>src/main/java</directory>表明资源文件的路径，
 * <include>** /*.xml</include>表明需要编译打包的文件类型是xml文件，
 * 如果有其它资源文件也需要打包，可以修改或添加通配符。
 */
public class GetPath {
    public static void main(String[] args) {

        //根据当前用户的相对目录来获取资源
        //!!! 通常是当前项目的根目录
        String dir = System.getProperty("user.dir");
        System.out.println(dir);

        //推荐使用相对于当前classpath的相对路径
        //ClassLoader类的getResource(String name),getResourceAsStream(String name)等方法，
        // 使用相对于当前项目的classpath的相对路径来查找资源
        // 根据当前线程获取的资源方式
        //!!! 推荐使用
        URL resource = Thread.currentThread().getContextClassLoader().getResource("alo");
        System.out.println(resource.toString());

        //根据类文件来获取资源路径,得到的是当前的classpath的绝对URI路径。
        URL resource1 = GetPath.class.getResource("/");
        System.out.println(resource1.toString());

        //获取的也是当前项目的classpath路径根目录
        URL systemResource = ClassLoader.getSystemResource("");
        System.out.println(systemResource.toString());

        // 相对路径,基于项目的根目录开始计算
        //File是获取项目的根目录开始
        File file = new File("pom.xml");
        System.out.println(file.getAbsolutePath());
    }
}
